home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / webx / pws010.lzh / ServerCore.c < prev   
C/C++ Source or Header  |  1998-09-11  |  7KB  |  320 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <sys/dos.h>
  6. #include <sys/stat.h>
  7. #include <sys/xglob.h>
  8.  
  9. #include <network.h>
  10. #include <socket.h>
  11.  
  12.  
  13. int sock80, temp_sock = -1;
  14. extern char *base_dir;
  15. extern char *quit_str;
  16. extern int v_option;
  17.  
  18.  
  19. typedef struct {
  20.     char *content_type;
  21.     char *ext_type;
  22. } TYPE_TABLE;
  23.  
  24. TYPE_TABLE type_table[]=
  25. {
  26.     "text/html", "HTM",
  27.     "text/html", "HTML",
  28.     "text/plain", "TXT",
  29.     "text/plain", "DOC",
  30.     "image/gif", "GIF",
  31.     "image/jpeg", "JPG",
  32.     "image/jpeg", "JPEG",
  33.     NULL, NULL
  34. };
  35.  
  36.  
  37. /* â\âPâbâgé≡âIü[âvâôé╖éΘüiÅφÆôë≡Å£é╔Ägéñé╛é»üj */
  38. int OpenSock (char *hostname, int port)
  39. {
  40.  
  41.     int sock;
  42.     struct hostent *h;
  43.     struct sockaddr_in addr;
  44.  
  45.     /* â\âPâbâgé≡ì∞ɼé╖éΘ */
  46.     if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
  47.         printf ("    âGâëü[ : â\âPâbâgé¬ì∞ɼé┼é½é▄é╣é±é┼é╡é╜\n");
  48.         return (-1);
  49.     }
  50.     memset (&addr, 0, sizeof (addr));    /* 0 é┼ûäé▀éΘ */
  51.  
  52.     addr.sin_family = AF_INET;    /* INETâhâüâCâôé≡ÄwÆΦ */
  53.     addr.sin_port = htons (port);    /* â|ü[âgö╘ìå */
  54.     /* âzâXâgû╝(www.xxx.co.jp) é≡ IP âAâhâîâX(int)é╔ò╧è╖ */
  55.     if ((h = gethostbyname (hostname)) == NULL) {
  56.         printf ("    âGâëü[ : âhâüâCâôû╝é¬é▌é┬é⌐éΦé▄é╣é±\n");
  57.         return (-1);
  58.     }
  59.     addr.sin_addr.s_addr = *(long *) h->h_addr;
  60.  
  61.     /* æèÄΦɵé╔É┌æ▒é╖éΘ */
  62.     if (v_option)
  63.         printf ("    É┌æ▒Æå...\n");
  64.  
  65.     if (connect (sock, (char *) &addr, sizeof (addr)) < 0) {
  66.         printf ("    âGâëü[ : É┌æ▒é╔Ä╕ösé╡é▄é╡é╜\n");
  67.         return (-1);
  68.     }
  69.     return (sock);
  70. }
  71.  
  72.  
  73. /* ÄwÆΦé│éΩé╜â\âPâbâgé⌐éτâüâbâZü[âWé≡Ä≤é»ÄµéΘ */
  74. int ReceiveMessage (int sock)
  75. {
  76.     char temp_str[1024];
  77.  
  78.     if (v_option)
  79.         printf ("Ä≤ÉMæ╥é┐...\n");
  80.     while (!socklen (sock, 0));    /* Ä≤ÉMæ╥é┐ */
  81.     do {
  82.         recvline (sock, temp_str, 1024);    /* Ä≤ÉM */
  83.         if (v_option)
  84.             printf ("Ä≤ÉM > %s\n", temp_str);
  85.     } while (socklen (sock, 0) > 0);
  86.  
  87.     return (0);
  88. }
  89.  
  90.  
  91. /* ÄwÆΦé│éΩé╜â\âPâbâgé╔âRâ}âôâhé≡æùéΘ */
  92. int SendCommand (int sock, char *cmd)
  93. {
  94.     if (v_option)
  95.         printf ("æùÉM > %s\n", cmd);
  96.     write_s (sock, cmd, strlen (cmd));    /* æùÉM */
  97.     while (!socklen (sock, 1));    /* æùÉMè«ù╣æ╥é┐ */
  98.     ReceiveMessage (sock);
  99.     return (0);
  100. }
  101.  
  102.  
  103. /* Passive ùpâ\âPâbâgé≡âIü[âvâôé╖éΘ */
  104. int OpenPassiveSock (int port)
  105. {
  106.     int sock;
  107.     struct sockaddr_in addr;
  108.  
  109.     /* â\âPâbâgé≡ì∞ɼé╖éΘ */
  110.     if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
  111.         printf ("    âGâëü[ : â\âPâbâgé¬ì∞ɼé┼é½é▄é╣é±é┼é╡é╜\n");
  112.         return (-1);
  113.     }
  114.     memset (&addr, 0, sizeof (addr));    /* 0 é┼ûäé▀éΘ */
  115.  
  116.     addr.sin_family = AF_INET;    /* INETâhâüâCâôé≡ÄwÆΦ */
  117.     addr.sin_port = htons (port);    /* â|ü[âgö╘ìå */
  118. #if    0
  119.     addr.sin_addr.s_addr = INADDR_ANY;
  120. #endif
  121.     addr.sin_addr.s_addr = htonl (0);    /* INADDR_ANY:0 */
  122.     /* æèÄΦɵé╔É┌æ▒é╖éΘ */
  123.     if (bind (sock, (char *) &addr, sizeof (addr)) < 0) {
  124.         printf ("    âGâëü[ : É┌æ▒é╔Ä╕ösé╡é▄é╡é╜\n");
  125.         return (-1);
  126.     }
  127.     if (listen (sock, 1) < 0) {
  128.         printf ("    âGâëü[ : listen é┼âGâëü[é¬ö¡É╢é╡é▄é╡é╜\n");
  129.         return (-1);
  130.     }
  131.     return (sock);
  132. }
  133.  
  134.  
  135.  
  136. /* É┌æ▒é│éΩéΘé╠é≡æ╥é┬ */
  137. int AcceptSock (int sock)
  138. {
  139.     struct sockaddr_in from;
  140.     int temp_sock;
  141.  
  142.     int len = sizeof (from);
  143.     if ((temp_sock = accept (sock, (char *) &from, &len)) < 0) {
  144.         printf ("    âGâëü[ : accept é┼âGâëü[é¬ö¡É╢é╡é▄é╡é╜\n");
  145.         return (-1);
  146.     }
  147.     return (temp_sock);
  148. }
  149.  
  150.  
  151. void CloseSock (int sock)
  152. {
  153.     if (sock > 0)
  154.         close_s (sock);
  155. }
  156.  
  157.  
  158. int ServerInit (void)
  159. {
  160.     if (_get_version ()< 0) {
  161.         printf ("(h)inetd.x é¬ÅφÆôé╡é─éóé▄é╣é±\n");
  162.         return (-1);
  163.     }
  164.     if ((sock80 = OpenPassiveSock (80)) < 0)
  165.         return (-1);
  166.     return (0);
  167. }
  168.  
  169.  
  170. int ServerMain (void)
  171. {
  172.     char temp_str[1024];
  173.     char method[64], url[1024], version[64];
  174.     FILE *fp;
  175.     char *content_type = "application/octet-stream";    /* ôΣé╠ègÆúÄqé╠ÅΩìçâRâîé╔é╚éΘ */
  176.     char *p = url;
  177.     char *ext = NULL;
  178.     TYPE_TABLE *t;
  179.  
  180.     if (v_option)
  181.         printf ("É┌æ▒é≡æ╥é┴é─éóé▄é╖\n");
  182.     if ((temp_sock = AcceptSock (sock80)) < 0)
  183.         return (-1);
  184.     sockmode (temp_sock, SOCK_ASCII);
  185.     seteol (temp_sock, "\r\n");
  186.     if (v_option)
  187.         printf ("É┌æ▒é│éΩé▄é╡é╜\n");
  188.  
  189.     while (recvline (temp_sock, temp_str, sizeof (temp_str)) < 0);
  190.     sscanf (temp_str, "%s %s %s", method, url, version);
  191.     if (v_option)
  192.         printf ("    âwâbâ_ > %s", temp_str);
  193.  
  194. #if    0
  195.     while (recvline (temp_sock, temp_str, sizeof (temp_str)) > 2) {
  196.         if (v_option)
  197.             printf ("    âwâbâ_ > %s", temp_str);
  198.     }
  199. #endif
  200.     do {
  201.         if (recvline (temp_sock, temp_str, sizeof (temp_str)) < 0)
  202.             break;
  203.         if (v_option)
  204.             printf ("    âwâbâ_ > %s", temp_str);
  205.     } while (*temp_str != '\n');
  206.  
  207.  
  208.     /* ÅIù╣ò╢ÄÜù±é╠â`âFâbâN */
  209.     sprintf (temp_str, "/%s", quit_str);
  210.     if (!strnicmp (url, temp_str, strlen (temp_str))) {
  211.         close_s (temp_sock);
  212.         temp_sock = -1;
  213.         return (-1);    /* ÅφÆôë≡Å£ */
  214.     }
  215.     if ((!strcmp (method, "HEAD")) || (!strcmp (method, "GET"))) {
  216.         struct stat sb;
  217.  
  218.         strcpy (temp_str, base_dir);
  219.         _dellastsep (temp_str);
  220.         strcat (temp_str, url);
  221.  
  222.         printf("é▒é▒é▄é┼é═ùêé─éóéΘ\n");
  223.         if ((fp = fopen (temp_str, "rb")) != NULL) {
  224.             /* âìü[âJâïâtâ@âCâïé╠ègÆúÄqé⌐éτ content_type é≡ô╛éΘ */
  225.             while (*p) {
  226.                 if (*p++ == '.')
  227.                     ext = p;
  228.             }
  229.             if (ext) {
  230.                 t = type_table;
  231.                 do {
  232.                     if (!stricmp (ext, t->ext_type)) {
  233.                         content_type = t->content_type;
  234.                         break;
  235.                     }
  236.                 } while ((++t)->ext_type != NULL);
  237.             }
  238.             stat (temp_str, &sb);
  239.             if (v_option)
  240.                 printf ("    %s é≡æùÉMé╡é▄é╖\n", temp_str);
  241.  
  242.             strcpy (temp_str, "HTTP/1.0 200 OK\r\n");
  243.             write_s (temp_sock, temp_str, strlen (temp_str));
  244.             sprintf (temp_str, "Content-Type: %s\r\n", content_type);
  245.             write_s (temp_sock, temp_str, strlen (temp_str));
  246.             sprintf (temp_str, "Content-Length: %d\r\n", sb.st_size);
  247.             write_s (temp_sock, temp_str, strlen (temp_str));
  248.             strftime (temp_str, 96, "Last-Modified: %a, %d %b %Y %T GMT\r\n", gmtime (&sb.st_ctime));
  249.             write_s (temp_sock, temp_str, strlen (temp_str));
  250.             strcpy (temp_str, "\r\n");    /* âwâbâ_é╠ÅIù╣ */
  251.             write_s (temp_sock, temp_str, strlen (temp_str));
  252.  
  253. #if 0
  254.             /* é▒éΩé╢éßé╚é±é⌐ô«é⌐é± */
  255.             while (!feof (fp))
  256.                 write_s (temp_sock, temp_str, fread (temp_str, sizeof (char), sizeof (temp_str), fp));
  257. #endif
  258.             if (!strcmp (method, "GET")) {
  259.                 int r1, r2 = 0;
  260.                 sockmode (temp_sock, SOCK_BINARY);
  261.  
  262.                 for (;;) {
  263.                     r1 = fread (temp_str, sizeof (char), sizeof (temp_str), fp);
  264.                     if ((r2 + r1) > sb.st_size) {
  265.                         r1 = sb.st_size - r2;
  266.                         write_s (temp_sock, temp_str, r1);
  267.                         break;
  268.                     }
  269.                     r2 += r1;
  270.                     write_s (temp_sock, temp_str, r1);
  271.                     if (feof (fp))
  272.                         break;
  273.                 }
  274.             }
  275.             fclose (fp);
  276.         } else {
  277.             strcpy (temp_str, "HTTP/1.0 404 Not Found\r\n");
  278.             write_s (temp_sock, temp_str, strlen (temp_str));
  279.  
  280.             if (!strcmp (method, "GET")) {
  281.                 strcpy (temp_str, "Content-Type: text/html\r\n");
  282.                 write_s (temp_sock, temp_str, strlen (temp_str));
  283.                 strcpy (temp_str, "\r\n");    /* âwâbâ_é╠ÅIù╣ */
  284.                 write_s (temp_sock, temp_str, strlen (temp_str));
  285.  
  286.                 strcpy (temp_str,
  287.                     "<HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD>"
  288.                     "<BODY><H1>404 Not Found</H1>\r\n"
  289.                     "</BODY></HTML>\r\n"
  290.                     );
  291.                 write_s (temp_sock, temp_str, strlen (temp_str));
  292.             } else {
  293.                 strcpy (temp_str, "\r\n");    /* âwâbâ_é╠ÅIù╣ */
  294.                 write_s (temp_sock, temp_str, strlen (temp_str));
  295.             }
  296.         }
  297.     } else {
  298.         /* HEAD/GET ê╚èOé╠Åêù¥ */
  299.     }
  300.     while (!socklen (temp_sock, 1));    /* æùÉMè«ù╣æ╥é┐ */
  301.     shutdown (temp_sock, 0);/* Ä≤ÉMé╡é╜âfü[â^é≡Ä≤é»Äµéτé╕üCé╖é╫é─öpèⁿé╖éΘ */
  302.     shutdown (temp_sock, 1);/* TCP FINé≡æùÉMé╡üCâfü[â^é╠æùÅoé≡éΓé▀éΘ */
  303.     //shutdown (temp_sock, 2);    /* connection é≡ aborté╖éΘ */
  304.     close_s (temp_sock);
  305.     temp_sock = -1;
  306.  
  307.     return (0);
  308. }
  309.  
  310.  
  311.  
  312. int ServerTini (void)
  313. {
  314.     if (sock80 > 0)
  315.         close_s (sock80);
  316.     if (temp_sock > 0)
  317.         close_s (temp_sock);
  318.     return (0);
  319. }
  320.